#include "CServer.h"
#include <iostream>

/**
 * @brief 服务器构造函数
 * @param io_context ASIO的IO上下文
 * @param port 服务器监听端口
 */
CServer::CServer(boost::asio::io_context &io_context, short port) : _io_context(io_context), _port(port),
																	_acceptor(io_context, tcp::endpoint(tcp::v4(), port))
{
	StartAccept();
}

/**
 * @brief 处理新连接的回调函数
 * @param new_session 新建立的会话对象
 * @param error 错误码
 */
void CServer::HandleAccept(shared_ptr<CSession> new_session, const boost::system::error_code &error)
{
	if (!error)
	{
		new_session->Start();
		_sessions.insert(make_pair(new_session->GetUuid(), new_session));
	}
	else
	{
		cout << "session accept failed, error is " << error.message() << endl;
	}

	StartAccept();
}

/**
 * @brief 开始监听新的客户端连接
 * 创建新的会话对象并异步等待连接
 */
void CServer::StartAccept()
{
	shared_ptr<CSession> new_session = make_shared<CSession>(_io_context, this);
	_acceptor.async_accept(new_session->GetSocket(), std::bind(&CServer::HandleAccept, this, new_session, placeholders::_1));
}

/**
 * @brief 清理指定UUID的会话
 * @param uuid 要清理的会话UUID
 */
void CServer::ClearSession(std::string uuid)
{
	_sessions.erase(uuid);
}
